part of '../animation.dart';

/// 快速动画[AnimationFast]
///
/// 通过[builder]中的[AnimationController]来控制动画
/// 动画遥控器[AnimationFast]
/// 使用这个class主要是因为Flutter中的动画非常繁琐，使用它可以减少StatefulWidget的出现，并且可以减少手动指定vsync的麻烦
///
/// 因此，只要指定动画如何运行，并指定遥控器的时间
/// 经过一系列的“魔法”后，builder就会给你一个开光过的遥控器
/// 此时你使用控制器进行前进、后退的操作，并且用它的值绑定在某个UI身上，发现都可以顺利运行了
///
/// 也就是说，你指定几个参数，然后它吐给你一个遥控器，这就是它的所有工作
/// 当然这个“吐”是需要在Widget内进行的，所以它必须以Widget的形式出现
class AnimationFast extends StatefulWidget {
  /// 从开始到结束的时间
  final Duration? duration;

  /// 回去的时间
  final Duration? durationBack;

  /// 比如可以设置动画的自动播放、循环播放等
  final Function(AnimationController)? init;

  /// 使用[AnimationController]来构建widget（这样可以在[StatelessWidget]中使用动画）
  final Widget Function(AnimationController) builder;

  const AnimationFast({
    this.duration,
    this.durationBack,
    required this.builder,
    this.init,
    super.key,
  });

  @override
  State<AnimationFast> createState() => _AnimationFastState();
}

class _AnimationFastState extends State<AnimationFast>
    with SingleTickerProviderStateMixin {
  late AnimationController control;

  @override
  void initState() {
    super.initState();

    // 1. 初始化动画控制器
    final defaultDuration = widget.duration ?? Duration(seconds: 1);
    control = AnimationController(
      vsync: this,
      duration: defaultDuration,
      reverseDuration: widget.durationBack ?? defaultDuration,
    );

    if (widget.init != null) widget.init!(control);
  }

  @override
  void dispose() {
    control.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 本质上是一个监听器，每当control变化时，都触发setState
    // 注：如果在后期动画性能非常重要，可以考虑将其中一些child做成const形式，以减少刷新的范围
    return AnimatedBuilder(
      animation: control,
      builder: (context, child) {
        return widget.builder(control);
      },
    );
  }
}
